package com.appspot.abcensys.server;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.Logger;

/**
 * CalendarServlet
 * 
 * Word gebruikt om diverse servlets te voorzien van diverse datum
 * 
 * @author Hugo Zonderland
 * 
 */

public class CalendarSupplier {

	// Calendar
	private Calendar cal;

	// Logger
	private static final Logger log = Logger.getLogger(CalendarSupplier.class.getName());

	/**
	 * Constructor
	 */
	public CalendarSupplier() {
		cal = Calendar.getInstance();
	}

	/**
	 * Haalt het huidige dagnummer op
	 * 
	 * @return int huidige dag van de week
	 */
	public int getDagNummer() {
		return cal.get(Calendar.DAY_OF_WEEK);
	}

	/**
	 * Haalt het huidige weeknummer op
	 * 
	 * @return int met huidige weeknummer
	 */
	public int getWeekNummer() {
		return cal.get(Calendar.WEEK_OF_YEAR);
	}

	/**
	 * Haalt het huidige jaar op
	 * 
	 * @return int met huidige jaar
	 */
	// TODO: Aanpassen wanneer we live gaan!
	public int getJaar() {
		return cal.get(Calendar.YEAR) - 1;
	}

	/**
	 * Haalt aan de hand van de dagnaam het nummer op
	 * 
	 * @param int met de dagnummer
	 * @return dagnaam
	 */
	public String getDagNaamByDagNummer(int dagNummer) {
		if (dagNummer == 0) {
			dagNummer = getDagNummer();
		}
		String s = "";
		switch (dagNummer) {
		case 2:
			s = "Maandag";
			break;
		case 3:
			s = "Dinsdag";
			break;
		case 4:
			s = "Woensdag";
			break;
		case 5:
			s = "Donderdag";
			break;
		case 6:
			s = "Vrijdag";
			break;
		}
		return s;
	}

	/**
	 * Geeft de dagnaam van een datum
	 * 
	 * @param String
	 *            met een datum dd-MM-yyy format
	 * @return String
	 */
	public String getDagNaamByDatum(String datum) {
		String s = "";
		try {
			DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
			Date date = (Date) formatter.parse(datum);
			Calendar cal1 = Calendar.getInstance();
			cal1.setTime(date);
			s = getDagNaamByDagNummer(cal1.get(Calendar.DAY_OF_WEEK));
		} catch (ParseException e) {
			System.out.println("Exception :" + e);
		}
		return s;
	}

	/**
	 * Haalt het dagnummer van een datum
	 * 
	 * @param datum
	 * @return int dagnummer
	 */
	public int getDagNummerByDatum(String datum) {
		int i = 0;
		try {
			DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
			Date date = (Date) formatter.parse(datum);
			Calendar cal1 = Calendar.getInstance();
			cal1.setTime(date);
			i = cal1.get(Calendar.DAY_OF_WEEK);
		} catch (ParseException e) {
			System.out.println("Exception :" + e);
		}
		return i;
	}

	/**
	 * Haalt de datum van vandaag op in dd-MM-yyyy formaat.
	 * 
	 * @return String met datum
	 */
	public String getDatumVandaag() {
		/*
		 * MA: 2 DI: 3 WO: 4 DO: 5 VR: 6 ZA: 7 ZO: 1
		 * 
		 * Op vrijdag ziekmelden voor morgen/vandaag kan niet. De datum
		 * verschuift dan ook naar maandag Eerst dag v/d week bepalen
		 */
		Calendar cal1 = Calendar.getInstance();
		int dag = cal1.get(Calendar.DAY_OF_WEEK);
		// Vr - Ma = 3 dagen
		if (dag == 6) {
			cal1.add(Calendar.DAY_OF_YEAR, 3);
		}
		// Za - Ma = 2 dagen
		else if (dag == 7) {
			cal1.add(Calendar.DAY_OF_YEAR, 2);
		}
		// Zo - Ma = 1 dag
		else if (dag == 1) {
			cal1.add(Calendar.DAY_OF_YEAR, 1);
		}

		Date datum = cal1.getTime();

		SimpleDateFormat prestring = new SimpleDateFormat("dd-MM-yyyy");
		StringBuilder string = new StringBuilder(prestring.format(datum));

		// log.info("Datumvandaag: " + string.toString());

		return string.toString();
	}

	/**
	 * Haalt de datum van morgen op in dd-MM-yyyy formaat.
	 * 
	 * @return String datum
	 */
	public String getDatumMorgen() {
		Calendar cal1 = Calendar.getInstance();
		int dag = cal1.get(Calendar.DAY_OF_WEEK);
		/*
		 * MA: 2 DI: 3 WO: 4 DO: 5 VR: 6 ZA: 7 ZO: 1
		 */
		if (dag >= 2 && dag <= 5) {
			cal1.add(Calendar.DAY_OF_YEAR, 1);
		} else if (dag == 6) {
			cal1.add(Calendar.DAY_OF_YEAR, 4);
		} else if (dag == 7) {
			cal1.add(Calendar.DAY_OF_YEAR, 3);
		} else {
			cal1.add(Calendar.DAY_OF_YEAR, 2);
		}

		Date datum = cal1.getTime();

		SimpleDateFormat prestring = new SimpleDateFormat("dd-MM-yyyy");
		StringBuilder string = new StringBuilder(prestring.format(datum));

		// log.info("Datummorgen: " + string.toString());

		return string.toString();
	}

	/**
	 * Zet een Date annotatie om naar dd-MM-yyyy formaat
	 * 
	 * @param Date
	 *            datum die omgezet moet worden
	 * @return String met datum annotatie
	 */
	public String getStringFromDate(Date datum) {
		SimpleDateFormat prestring = new SimpleDateFormat("dd-MM-yyyy");
		StringBuilder string = new StringBuilder(prestring.format(datum));
		return string.toString();
	}

	/**
	 * Geeft de timestamp terug van de ingegeven datum (dd-MM-yyy hh:mm formaat)
	 * 
	 * @param String
	 *            datum yy-MM-dd H:m:s formaat
	 * @return Timestamp met timestamp van de ingegeven datum
	 */
	public Timestamp getTimestampFromString(String datum) {
		try {
			SimpleDateFormat sInit = new SimpleDateFormat("dd-MM-yyyy H:m:s");
			SimpleDateFormat sOut = new SimpleDateFormat("yyyy-MM-dd H:m:s");
			Date d = sInit.parse(datum);
			String nieuwDatum = sOut.format(d);
			return Timestamp.valueOf(nieuwDatum);
		} catch (ParseException pe) {
			System.out.println("Parse Exception : " + pe);
		}
		return null;
	}

	/**
	 * Maakt van de opgehaalde Timestamp een integer
	 * 
	 * @param String
	 *            datum (dd-MM-yyyy H:m) format
	 * @return Long a.d.v timestamp
	 */
	public Long getTimestampFromStringAsLong(String datum) {
		return this.getTimestampFromString(datum).getTime();
	}
	
	/**
	 * Haalt de huidige timestamp op
	 * @return Timestamp
	 */
	public Timestamp getHuidigeTimestamp() {
		Date today = new Date();
		Timestamp time = new Timestamp(today.getTime());
		return time;
	}

	/**
	 * Haalt de huidige timestamp op
	 * 
	 * @return Long met timestamp
	 */
	public Long getHuidigeTimestampAsLong() {
		Date today = new Date();
		Timestamp time = new Timestamp(today.getTime());
		return time.getTime();
	}
}
